package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.PercepcionDAO;
import mx.ipn.persistencia.dao.PercepcionPuestoDAO;
import mx.ipn.persistencia.dao.PuestoDAO;
import mx.ipn.to.PercepcionPuestoTO;
import mx.ipn.to.PuestoTO;
import mx.ipn.to.PercepcionTO;

public class PercepcionPuestoDAOMySQL implements PercepcionPuestoDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(PercepcionPuestoDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO percepcion_puesto(id_percepcion,id_puesto) VALUES(?,?)";
	private static final String UPDATE = "UPDATE percepcion_puesto SET id_percepcion=?,id_puesto=? WHERE id_percepcion=? and id_puesto=?";
	private static final String FINDBYPERCEPCIONPUESTO = "SELECT * FROM percepcion_puesto WHERE id_percepcion=? and id_puesto=?";
	private static final String SELECT = "SELECT * FROM percepcion_puesto";
	private static final String SELECTBYPERCEPCION = "SELECT * FROM percepcion_puesto WHERE id_percepcion=?";
	private static final String SELECTBYPUESTO = "SELECT * FROM percepcion_puesto WHERE id_puesto=?";

	@Override
	public PercepcionPuestoTO findPercepcionPuestoByPercepcionPuesto(
			int idPercepcion, short idPuesto) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(FINDBYPERCEPCIONPUESTO);

			ps.setInt(1, idPercepcion);
			ps.setShort(2, idPuesto);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				// Crea la fabrica especifica de MySQL
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				// Crea un DAO para la tabla TIPOEMPLEADO
				PercepcionDAO percepcionDAO = fabricaMySQL.getPercepcionDAO();
				PuestoDAO puestoDAO = fabricaMySQL.getPuestoDAO();

				PercepcionPuestoTO percepcionPuestoTO = new PercepcionPuestoTO(
						percepcionDAO.findPercepcionById(idPercepcion),
						puestoDAO.findPuestoById(idPuesto));

				ps.close();
				conexion.close();
				return percepcionPuestoTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertPercepcionPuesto(PercepcionPuestoTO percepcionPuestoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps
					.setInt(1, percepcionPuestoTO.getPercepcionTO()
							.getIdPercepcion());
			ps.setShort(2, percepcionPuestoTO.getPuestoTO().getIdPuesto());

			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<PercepcionPuestoTO> selectPercepcionPuesto() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			PercepcionDAO percepcionDAO = null;
			PuestoDAO puestoDAO = null;

			ArrayList<PercepcionPuestoTO> percepcionPuestoTO = null;
			PercepcionPuestoTO percepcionPuestoTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (percepcionPuestoTO == null) {
					percepcionPuestoTO = new ArrayList<PercepcionPuestoTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					percepcionDAO = fabricaMySQL.getPercepcionDAO();
					puestoDAO = fabricaMySQL.getPuestoDAO();
				}

				percepcionPuestoTO2 = new PercepcionPuestoTO(percepcionDAO
						.findPercepcionById(rs.getInt("id_percepcion")),
						puestoDAO.findPuestoById(rs.getShort("id_puesto")));

				percepcionPuestoTO.add(percepcionPuestoTO2);
			}
			ps.close();
			conexion.close();
			return percepcionPuestoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public PercepcionPuestoTO selectPercepcionPuestoByPercepcion(
			int idPercepcion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			PercepcionDAO percepcionDAO = null;
			PuestoDAO puestoDAO = null;

			ArrayList<PuestoTO> listPuestoTO = null;

			PercepcionPuestoTO percepcionPuestoTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYPERCEPCION);
			ps.setInt(1, idPercepcion);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listPuestoTO == null) {

					listPuestoTO = new ArrayList<PuestoTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					puestoDAO = fabricaMySQL.getPuestoDAO();
					percepcionDAO = fabricaMySQL.getPercepcionDAO();
				}

				listPuestoTO.add(puestoDAO.findPuestoById(rs
						.getShort("id_puesto")));

			}
			if (listPuestoTO != null) {
				
				PuestoTO[] arrPuestoTO = (PuestoTO[])listPuestoTO.toArray(new PuestoTO[listPuestoTO.size()]);
				
				percepcionPuestoTO = new PercepcionPuestoTO(percepcionDAO
						.findPercepcionById(idPercepcion), arrPuestoTO);
			}
			ps.close();
			conexion.close();
			return percepcionPuestoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public PercepcionPuestoTO selectPercepcionPuestoByPuesto(short idPuesto) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			PercepcionDAO percepcionDAO = null;
			PuestoDAO puestoDAO = null;

			ArrayList<PercepcionTO> listPercepcionTO = null;

			PercepcionPuestoTO percepcionPuestoTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYPUESTO);
			ps.setShort(1, idPuesto);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listPercepcionTO == null) {

					listPercepcionTO = new ArrayList<PercepcionTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					percepcionDAO = fabricaMySQL.getPercepcionDAO();
					puestoDAO = fabricaMySQL.getPuestoDAO();
				}

				listPercepcionTO.add(percepcionDAO.findPercepcionById(rs
						.getInt("id_percepcion")));

			}
			if (listPercepcionTO != null) {
				
				PercepcionTO[] arrPercepcionTO = (PercepcionTO[])listPercepcionTO.toArray(new PercepcionTO[listPercepcionTO.size()]);	
				
				percepcionPuestoTO = new PercepcionPuestoTO(arrPercepcionTO,
						puestoDAO.findPuestoById(idPuesto));
			}
			ps.close();
			conexion.close();
			return percepcionPuestoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updatePercepcionPuesto(PercepcionPuestoTO percepcionPuestoTO,
			PercepcionPuestoTO percepcionPuestoTONuevo) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setInt(1, percepcionPuestoTONuevo.getPercepcionTO()
					.getIdPercepcion());
			ps.setShort(2, percepcionPuestoTONuevo.getPuestoTO().getIdPuesto());
			ps
					.setInt(3, percepcionPuestoTO.getPercepcionTO()
							.getIdPercepcion());
			ps.setShort(4, percepcionPuestoTO.getPuestoTO().getIdPuesto());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
